Streams হলো Node.js এর একটি শক্তিশালী বৈশিষ্ট্য যা ডেটা পড়া বা লেখা করার জন্য ব্যবহৃত হয়। স্ট্রিমের মাধ্যমে আপনি ডেটাকে টুকরো টুকরো করে প্রসেস করতে পারেন, ফলে এটি বড় ডেটা বা ফাইল হ্যান্ডলিংয়ে কার্যকরী হয়ে ওঠে। Node.js এ দুটি প্রধান ধরনের স্ট্রিম রয়েছে: Readable Streams এবং Writable Streams।
১. Readable Streams
Readable Stream এমন একটি স্ট্রিম যা ডেটা "পড়ে" (read) নেয়। এটি একটি সঞ্চিত ডেটা স্ট্রিম করে, যা ডেটা ইভেন্টের মাধ্যমে প্রসেস করা হয়। যেমন, ফাইল থেকে ডেটা পড়া বা HTTP রিকোয়েস্ট থেকে ডেটা গ্রহণ করা।
Readable Stream তৈরি করা
Node.js এর Readable ক্লাস থেকে একটি কাস্টম Readable Stream তৈরি করা যেতে পারে। নিচে একটি উদাহরণ দেওয়া হল, যেখানে একটি কাস্টম Readable Stream তৈরি করা হচ্ছে:
const { Readable } = require('stream');
// একটি কাস্টম Readable Stream তৈরি করা
class MyReadableStream extends Readable {
constructor(options) {
super(options);
this.data = ['Hello', ' ', 'World', '!', '\n']; // আমাদের ডেটা
this.index = 0;
}
// _read() মেথড: স্ট্রিমের ডেটা পাঠানোর জন্য ব্যবহৃত হয়
_read(size) {
if (this.index < this.data.length) {
// ডেটা পাঠানো
this.push(this.data[this.index]);
this.index++;
} else {
// ডেটা শেষ, স্ট্রিম বন্ধ
this.push(null);
}
}
}
// কাস্টম Readable Stream ব্যবহার করা
const myStream = new MyReadableStream();
myStream.on('data', (chunk) => {
console.log('Received chunk:', chunk.toString());
});
myStream.on('end', () => {
console.log('No more data.');
});Output:
Received chunk: Hello
Received chunk:
Received chunk: World
Received chunk: !
Received chunk:
No more data.এখানে, _read() মেথডটি কাস্টম Readable স্ট্রিম তৈরি করার জন্য ব্যবহৃত হয়েছে। এই মেথডে ডেটা push করা হয় এবং শেষ হলে null পাঠিয়ে স্ট্রিম বন্ধ করা হয়।
২. Writable Streams
Writable Stream এমন একটি স্ট্রিম যা ডেটা "লেখে" (write) নেয়। এটি ডেটা গ্রহণ করে এবং সেই ডেটা নির্দিষ্ট জায়গায় (যেমন ফাইল, নেটওয়ার্ক, ইত্যাদি) লেখে।
Writable Stream তৈরি করা
Node.js এর Writable ক্লাস থেকে একটি কাস্টম Writable Stream তৈরি করা যেতে পারে। নিচে একটি উদাহরণ দেওয়া হলো:
const { Writable } = require('stream');
// একটি কাস্টম Writable Stream তৈরি করা
class MyWritableStream extends Writable {
constructor(options) {
super(options);
}
// _write() মেথড: স্ট্রিমের ডেটা লেখার জন্য ব্যবহৃত হয়
_write(chunk, encoding, callback) {
console.log('Writing chunk:', chunk.toString());
callback(); // ডেটা লেখার পর কলব্যাক কল করা
}
}
// কাস্টম Writable Stream ব্যবহার করা
const myStream = new MyWritableStream();
myStream.write('Hello, ');
myStream.write('World!');
myStream.end(); // স্ট্রিম বন্ধOutput:
Writing chunk: Hello,
Writing chunk: World!এখানে, _write() মেথডটি ডেটা লেখার জন্য ব্যবহৃত হয়েছে। chunk আর্গুমেন্টে ডেটা পাস করা হয়, এবং callback() কল করে লেখার কাজ সম্পন্ন করা হয়।
৩. Readable এবং Writable Streams একসাথে ব্যবহার করা
Readable এবং Writable Streams একসাথে ব্যবহার করে আপনি একটি স্ট্রিমের ডেটা অন্য স্ট্রিমে পাঠাতে পারেন। এটি স্ট্রিম পাইপলাইন তৈরি করার জন্য ব্যবহৃত হয়।
উদাহরণ: Readable এবং Writable Stream এর মধ্যে ডেটা পিপ করা
const { Readable, Writable } = require('stream');
// Readable Stream তৈরি করা
class MyReadableStream extends Readable {
constructor(options) {
super(options);
this.data = ['Hello', ' ', 'World', '!\n'];
this.index = 0;
}
_read(size) {
if (this.index < this.data.length) {
this.push(this.data[this.index]);
this.index++;
} else {
this.push(null);
}
}
}
// Writable Stream তৈরি করা
class MyWritableStream extends Writable {
constructor(options) {
super(options);
}
_write(chunk, encoding, callback) {
console.log('Received:', chunk.toString());
callback();
}
}
// Readable Stream থেকে Writable Stream এ ডেটা পিপ করা
const readableStream = new MyReadableStream();
const writableStream = new MyWritableStream();
// পিপিং করা
readableStream.pipe(writableStream);Output:
Received: Hello
Received:
Received: World
Received: !এখানে, pipe() মেথড ব্যবহার করা হয়েছে, যা Readable Stream থেকে ডেটা গ্রহণ করে তা Writable Stream এ পাঠায়। স্ট্রিমের মধ্যে ডেটা প্রবাহিত হওয়ার সময়, Received: বার্তা সহ ডেটা প্রিন্ট করা হচ্ছে।
সারাংশ
- Readable Streams: ডেটা পড়ার জন্য ব্যবহৃত হয়, যেখানে ডেটা টুকরো টুকরো করে পাঠানো হয় এবং
_read()মেথডের মাধ্যমে পাঠানো হয়। - Writable Streams: ডেটা লেখার জন্য ব্যবহৃত হয়, যেখানে ডেটা
_write()মেথডের মাধ্যমে লেখা হয়। - Streams Node.js-এ বড় ডেটা বা ফাইল প্রসেসিংয়ের জন্য উপযুক্ত, কারণ এগুলি একসাথে অনেক ডেটা প্রসেস করতে সক্ষম এবং র্যাম-এ বড় ডেটা লোড করার প্রয়োজন পড়ে না।
- Readable এবং Writable Streams একসাথে ব্যবহার করে আপনি ডেটা এক স্ট্রিম থেকে অন্য স্ট্রিমে পাঠাতে পারেন, যা স্ট্রিম পাইপলাইন তৈরির জন্য ব্যবহৃত হয়।
Read more